From 266a06100af5272c956bf7dba719b0b823647a5b Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 10 Mar 2008 22:51:57 +0000 Subject: [PATCH] x86: Reserve 32 bits for each of acpiid and apicid in new phys_id vcpu hypercall. Signed-off-by: Keir Fraser --- xen/arch/x86/domain.c | 5 +++-- xen/include/public/vcpu.h | 10 ++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 255468db1b..39e6d8efd2 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -961,8 +961,9 @@ arch_do_vcpu_op( if ( !v->domain->is_pinned ) break; - cpu_id.phys_id = (x86_cpu_to_apicid[v->vcpu_id] | - (acpi_get_processor_id(v->vcpu_id) << 8)); + cpu_id.phys_id = + (uint64_t)x86_cpu_to_apicid[v->vcpu_id] | + ((uint64_t)acpi_get_processor_id(v->vcpu_id) << 32); rc = -EFAULT; if ( copy_to_guest(arg, &cpu_id, 1) ) diff --git a/xen/include/public/vcpu.h b/xen/include/public/vcpu.h index b7173c6024..ab6549370e 100644 --- a/xen/include/public/vcpu.h +++ b/xen/include/public/vcpu.h @@ -185,8 +185,8 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_register_vcpu_info_t); /* * Get the physical ID information for a pinned vcpu's underlying physical * processor. The physical ID informmation is architecture-specific. - * On x86: id[7:0]=apic_id, id[15:8]=acpi_id, id[63:16]=mbz, - * and an unavailable identifier is returned as 0xff. + * On x86: id[31:0]=apic_id, id[63:32]=acpi_id, and all values 0xff and + * greater are reserved. * This command returns -EINVAL if it is not a valid operation for this VCPU. */ #define VCPUOP_get_physid 12 /* arg == vcpu_get_physid_t */ @@ -195,8 +195,10 @@ struct vcpu_get_physid { }; typedef struct vcpu_get_physid vcpu_get_physid_t; DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t); -#define xen_vcpu_physid_to_x86_apicid(physid) ((uint8_t)((physid)>>0)) -#define xen_vcpu_physid_to_x86_acpiid(physid) ((uint8_t)((physid)>>8)) +#define xen_vcpu_physid_to_x86_apicid(physid) \ + ((((uint32_t)(physid)) >= 0xff) ? 0xff : ((uint8_t)(physid))) +#define xen_vcpu_physid_to_x86_acpiid(physid) \ + ((((uint32_t)((physid)>>32)) >= 0xff) ? 0xff : ((uint8_t)((physid)>>32))) #endif /* __XEN_PUBLIC_VCPU_H__ */ -- 2.30.2